#ifndef __BASICTYPEUTITLITY_H__
#define __BASICTYPEUTITLITY_H__

#include "BasicType/BasicType_1.h"
#include "BasicType/BasicType_2.h"

namespace GCRE {
	namespace BasicType {

		class StringUtitlity {
			public:
				static void		SplitIntoTokens( const SFString& source, const SFString& seps, MFString& tokens );
				static int		CompareIgnoreCase( const SFString& src1, const SFString& src2 );
				static void		SplitFullFileName( const SFString& fullfilename, SFString& path, SFString& filename, SFString& ext );
				static void		ReplaceCharacter( const SFString& source, SFChar s, SFChar t, SFString& result );

			protected:
			private:
				StringUtitlity();
		};

		class MatrixUtitlity {
			public:
				static Matrix44f			Translation( const Vec3f& T );
				static Matrix44f			Translation( SFFloat x, SFFloat y, SFFloat z );
				static Matrix44f			Scale( const Vec3f& S );
				static Matrix44f			Scale( SFFloat sx, SFFloat sy, SFFloat sz );
				static Matrix44f			Scale( SFFloat s );
				static Matrix44f			RotationX( SFFloat rad );
				static Matrix44f			RotationY( SFFloat rad );
				static Matrix44f			RotationZ( SFFloat rad );
				static Matrix44f			RotationAxis( const Vec3f& R, SFFloat rad );

			protected:
			private:
				MatrixUtitlity();
		};

		class VectorUtitlity {
			public:
				static const SFVec3f XAxis;
				static const SFVec3f YAxis;
				static const SFVec3f ZAxis;

				static SFVec3f Cross( const SFVec3f& v1, const SFVec3f& v2 );

			protected:
			private:
				VectorUtitlity();
		};
		
		class QuaternionUtitlity {
			public:
				static Quaternion Slerp( SFFloat t, const Quaternion& q0, const Quaternion& q1 );
				static Quaternion SlerpExtraSpins( SFFloat t, const Quaternion& q0, const Quaternion& q1, SFInt k );

			protected:
			private:
		};
	}
}

#endif	//	__BASICTYPEUTITLITY_H__